package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.manager.generico.ManagerPesquisarGenerico;
import br.com.foxinline.modelo.Grupo;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.servico.GrupoServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.util.Msg;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.DualListModel;

/**
 *
 * @author ely
 */
@ManagedBean
@ViewScoped
public class ManagerPesquisarUsuario extends ManagerPesquisarGenerico<Usuario> {

    @EJB
    UsuarioServico usuarioServico;
    @EJB
    GrupoServico groupService;
    private Usuario usuario;
    private String confirm;
    private String usuarioEditar;
    private String usuarioVisualizar;
    private String userAcess;
    private Usuario usuarioPesquisar;
    private List<Usuario> usuarios;
    private DualListModel<Grupo> dualGrupo;
    private List<Grupo> groups;
    private String passwordOld;
    private String passwordNew;
    private Usuario showUser;
    private List<Grupo> showGroups;
    private Usuario acessUser;

    @Override
    @PostConstruct
    public void init() {
        setServico(usuarioServico);

        usuarioPesquisar = new Usuario();
        usuarios = new ArrayList<Usuario>();

        dualGrupo = new DualListModel<Grupo>();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        usuarioEditar = params.get("usuarioEditar");
        usuarioVisualizar = params.get("usuarioVisualizar");
        userAcess = params.get("userAcess");
        paramPost();
    }

    public void atualizar() {
        try {
            usuarioServico.update(confirm, passwordOld, passwordNew, usuario);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void updateAcess() {
        try {
            acessUser.setGrupos(dualGrupo.getTarget());
            usuarioServico.update(acessUser);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    @Override
    public void pesquisar() {
        entidadePesquisar = usuarioPesquisar;

        getSearchResults().setFirst(0);
        onLoadModel();
    }

    public void paramPost() {
        try {
            if (usuarioVisualizar != null) {
                showUser = usuarioServico.find(Long.parseLong(usuarioVisualizar));
                showGroups = groupService.find(showUser);
                showUser.setGrupos(showGroups);
            } else if (usuarioEditar != null) {
                usuario = usuarioServico.find(Long.parseLong(usuarioEditar));

            } else if (userAcess != null) {
                acessUser = usuarioServico.find(Long.parseLong(userAcess));
                groups = groupService.find(acessUser);
                acessUser.setGrupos(groups);
                List<Grupo> lst = groupService.findAll();
                lst.removeAll(acessUser.getGrupos());
                dualGrupo = new DualListModel<Grupo>(lst, acessUser.getGrupos());

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void remover() {
    }

    @Override
    public void limpar() {
        usuarioPesquisar = new Usuario();
    }

    public boolean isHabilitarEditarSenha() {
        return Long.parseLong(usuarioEditar) == usuarioServico.getCurrentUser().getId();
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getConfirm() {
        return confirm;
    }

    public void setConfirm(String confirm) {
        this.confirm = confirm;
    }

    public DualListModel<Grupo> getDualGrupo() {
        return dualGrupo;
    }

    public void setDualGrupo(DualListModel<Grupo> dualGrupo) {
        this.dualGrupo = dualGrupo;
    }

    public Usuario getUsuarioPesquisar() {
        return usuarioPesquisar;
    }

    public void setUsuarioPesquisar(Usuario searchUser) {
        this.usuarioPesquisar = searchUser;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public String getPasswordOld() {
        return passwordOld;
    }

    public void setPasswordOld(String passwordOld) {
        this.passwordOld = passwordOld;
    }

    public String getPasswordNew() {
        return passwordNew;
    }

    public void setPasswordNew(String passwordNew) {
        this.passwordNew = passwordNew;
    }

    public Usuario getShowUser() {
        return showUser;
    }

    public void setShowUser(Usuario showUser) {
        this.showUser = showUser;
    }

    public List<Grupo> getShowGroups() {
        return showGroups;
    }

    public void setShowGroups(List<Grupo> showGroups) {
        this.showGroups = showGroups;
    }
}
